import { $get, $post, $put, $del } from '@/assets/http.ts'
import type { AxiosResponse } from 'axios'

interface API_RES extends AxiosResponse{
    code: number,
    data: any,
    success: boolean,
    message: any,
    // noinspection JSAnnotator
    status: 'ok' | 'failed',
}

export class apiRequest {
    static get(url, config) {
        return new Promise((resolve, reject) => {
            $get(url, config).then((res: API_RES) => {
                if (res.success || res.status === 'ok') {
                    resolve(res.data)
                } else {
                    reject(new Error(res.status))
                }
            }).catch(err => {
                if (err.message) {
                    reject(new Error(err.message))
                } else {
                    reject(err)
                }
            })
        })
    }

    static post(url, data, config) {
        return new Promise((resolve, reject) => {
            $post(url, data, config).then((res: API_RES) => {
                if (res.success || res.status === 'ok') {
                    resolve(res.data)
                } else {
                    reject(new Error(res.status))
                }
            }).catch(err => {
                if (err.message) {
                    reject(new Error(err.message))
                } else {
                    reject(err)
                }
            })
        })
    }

    static put(url, data, config) {
        return new Promise((resolve, reject) => {
            $put(url, data, config).then((res: API_RES) => {
                if (res.success || res.status === 'ok') {
                    resolve(res.data)
                } else {
                    reject(new Error(res.status))
                }
            }).catch(err => {
                if (err.message) {
                    reject(new Error(err.message))
                } else {
                    reject(err)
                }
            })
        })
    }

    static del(url, config) {
        return new Promise((resolve, reject) => {
            $del(url, config).then((res: API_RES) => {
                if (res.success || res.status === 'ok') {
                    resolve(res.data)
                } else {
                    reject(new Error(res.status))
                }
            }).catch(err => {
                if (err.message) {
                    reject(new Error(err.message))
                } else {
                    reject(err)
                }
            })
        })
    }

    static res(url: string, config: any = {}) {
        // 提取下载配置和文件名
        const { download = false, filename: customFilename, ...requestConfig } = config;

        // 如果是下载操作，强制设置响应类型为 blob
        if (download) {
            // noinspection TypeScriptUnresolvedReference
            requestConfig.responseType = 'blob';
        }

        return new Promise((resolve, reject) => {
            $get(url, requestConfig).then((res: AxiosResponse) => {
                // 处理下载请求
                if (download) {
                    try {
                        // 1. 确定文件名（优先级：自定义 > 响应头 > URL）
                        let filename = customFilename;
                        if (!filename) {
                            const contentDisposition = res.headers?.['content-disposition'];
                            if (contentDisposition) {
                                const match = contentDisposition.match(/filename="?([^"]+)"?/);
                                if (match?.[1]) filename = match[1];
                            }
                        }
                        if (!filename) {
                            const urlPath = url.split('?')[0];
                            filename = urlPath.substring(urlPath.lastIndexOf('/') + 1) || 'download';
                        }

                        // 2. 创建下载链接
                        const blob = new Blob([res.data]);
                        const blobUrl = window.URL.createObjectURL(blob);
                        const link = document.createElement('a');
                        link.href = blobUrl;
                        link.download = filename;
                        link.style.display = 'none';

                        // 3. 触发下载
                        document.body.appendChild(link);
                        link.click();

                        // 4. 清理资源
                        setTimeout(() => {
                            document.body.removeChild(link);
                            window.URL.revokeObjectURL(blobUrl);
                        }, 100);

                        // 5. 返回成功信息
                        resolve({
                            success: true,
                            filename: filename,
                            size: blob.size,
                            type: blob.type
                        });
                    } catch (e) {
                        reject(new Error('文件下载失败: ' + (e as Error).message));
                    }
                }
                // 处理普通静态资源请求
                else {
                    resolve(res.data);
                }
            }).catch(err => {
                // 统一错误处理
                const errorMsg = err.response?.data?.message || err.message || '静态资源请求失败';
                reject(new Error(errorMsg));
            });
        });
    }

    // // 流式GET请求
    // static streamGet(url, config = {}) {
    //     return new Promise((resolve, reject) => {
    //         const controller = new AbortController();
    //         const signal = controller.signal;
    //
    //         // 添加取消方法到返回对象
    //         const result = {
    //             cancel: () => controller.abort(),
    //             progress: 0,
    //             received: 0,
    //             done: false
    //         };
    //
    //         fetch(url, { ...config, signal })
    //             .then(response => {
    //                 if (!response.ok) {
    //                     throw new Error(`HTTP error! status: ${response.status}`);
    //                 }
    //
    //                 const contentLength = response.headers.get('Content-Length');
    //                 const totalSize = contentLength ? parseInt(contentLength) : null;
    //                 let receivedSize = 0;
    //                 const reader = response.body.getReader();
    //
    //                 // 创建可读流
    //                 const stream = new ReadableStream({
    //                     start(controller) {
    //                         function push() {
    //                             reader.read().then(({ done, value }) => {
    //                                 if (done) {
    //                                     controller.close();
    //                                     result.done = true;
    //                                     return;
    //                                 }
    //
    //                                 // 更新进度
    //                                 receivedSize += value.length;
    //                                 result.received = receivedSize;
    //
    //                                 if (totalSize) {
    //                                     result.progress = Math.round((receivedSize / totalSize) * 100);
    //                                 }
    //
    //                                 // 将数据块发送给调用者
    //                                 controller.enqueue(value);
    //                                 push();
    //                             }).catch(error => {
    //                                 controller.error(error);
    //                             });
    //                         }
    //                         push();
    //                     }
    //                 });
    //
    //                 resolve({
    //                     ...result,
    //                     stream,
    //                     response
    //                 });
    //             })
    //             .catch(error => {
    //                 reject(error);
    //             });
    //     });
    // }
    //
    // // 流式POST请求
    // static streamPost(url, data, config = {}) {
    //     return new Promise((resolve, reject) => {
    //         const controller = new AbortController();
    //         const signal = controller.signal;
    //
    //         // 添加取消方法到返回对象
    //         const result = {
    //             cancel: () => controller.abort(),
    //             progress: 0,
    //             received: 0,
    //             done: false
    //         };
    //
    //         fetch(url, {
    //             ...config,
    //             method: 'POST',
    //             body: JSON.stringify(data),
    //             headers: {
    //                 'Content-Type': 'application/json',
    //                 ...config.headers
    //             },
    //             signal
    //         })
    //             .then(response => {
    //                 if (!response.ok) {
    //                     throw new Error(`HTTP error! status: ${response.status}`);
    //                 }
    //
    //                 const contentLength = response.headers.get('Content-Length');
    //                 const totalSize = contentLength ? parseInt(contentLength) : null;
    //                 let receivedSize = 0;
    //                 const reader = response.body.getReader();
    //
    //                 // 创建可读流
    //                 const stream = new ReadableStream({
    //                     start(controller) {
    //                         function push() {
    //                             reader.read().then(({ done, value }) => {
    //                                 if (done) {
    //                                     controller.close();
    //                                     result.done = true;
    //                                     return;
    //                                 }
    //
    //                                 // 更新进度
    //                                 receivedSize += value.length;
    //                                 result.received = receivedSize;
    //
    //                                 if (totalSize) {
    //                                     result.progress = Math.round((receivedSize / totalSize) * 100);
    //                                 }
    //
    //                                 // 将数据块发送给调用者
    //                                 controller.enqueue(value);
    //                                 push();
    //                             }).catch(error => {
    //                                 controller.error(error);
    //                             });
    //                         }
    //                         push();
    //                     }
    //                 });
    //
    //                 resolve({
    //                     ...result,
    //                     stream,
    //                     response
    //                 });
    //             })
    //             .catch(error => {
    //                 reject(error);
    //             });
    //     });
    // }
}

export default new apiRequest()